package main

import "fmt"

// ==========变量==========
// 1、全局变量声明、赋值后可以不使用
// 2、局部变量声明、赋值后必须被使用
// 3、在同一作用域下被声明过的变量不可以再次被声明
// 4、只能在函数、方法内部使用:=来声明、赋值变量
// 5、使用:=来声明、赋值单个变量, :=左侧的变量名在同一作用域下必须使用新变量名
// 6、使用:=来声明、赋值多个变量, :=左侧的变量名在同一作用域下至少有一个新变量
// 7、声明的变量都有对应的零值, 整数|浮点数: 0, 复数: (0+0i), 布尔型: false, 字符串: "", 切片|指针|接口|管道|映射|函数|异常: nil

// **********全局变量**********
// 方式1: 只声明, 声明后只能在函数内部被赋值
var globalVar1 bool

// 错误: globalVar1 = true

// 方式2: 声明并赋值, 指定数据类型
var globalVar2 bool = true
var s []int = make([]int, 0)

// 方式3: 声明并赋值, 不指定数据类型, 类型推导
var globalVar3 = 1.2
var m = make(map[string]int)

// 方式4: 多个变量同时声明、赋值
var (
	globalVar4 = 100
	globalVar5 = "Mary"
)

// **********局部单变量**********
func localVariable() {
	// 方式1: 先声明后赋值
	var i int
	i = 100
	fmt.Println(i)

	// 方式2: 声明并赋值, 指定数据类型
	var j string = "Hello"
	fmt.Println(j)

	// 方式3: 声明并赋值, 不指定数据类型, 类型推导
	var k = "World"
	fmt.Println(k)

	// 方式4: 使用:=
	l := 3
	fmt.Println(l)
}

// **********局部多变量**********
func localVariables() {
	// 方式1: 多个变量声明同一类型
	var a, b, c float64
	fmt.Println(a, b, c)

	// 方式2: 多个变量声明并赋值不同类型
	var x, y, z = "go", 0.1, 1
	fmt.Println(x, y, z)

	// 方式3: 使用:=给多个变量声明并赋值不同类型
	m, n := 'A', 1
	fmt.Println(m, n)

	// 这里的m和方式3里声明的m指向同一个地址, 因此这里的m必须接收和方式3声明同类型的值
	m, o := 'B', 3
	fmt.Println(m, o)
}

func main() {
	localVariable()
	localVariables()
}
